Migrating to Mongoose 8
書かれている全項目を調査したshokai.icon
このリポジトリ内の実装と照らし合わせて1つずつレポートしてください。
migration内容を私に説明しつつ、現在の実装に問題が無いか調査してくれ、という事です。
コードの変更は最後にまとめて行うので、まだやらなくていいです
Deep Agent modeで開始
既にnpm自体はmongoose 8に更新してしまったのですが、migration guideの内容について改めて確認したい
このリポジトリ内の実装と照らし合わせて1つずつレポートしてください。
migration内容を私に説明しつつ、現在の実装に問題が無いか調査してくれ、という事です。
コードの変更は最後にまとめて行うので、まだやらなくていいです
リズム合わなすぎてキツくなってきたshokai.icon
Removed rawResult option for findOneAndUpdate()
使用箇所無し
deleteOneの返り値が変わった
これまでは削除したdocument数が返っていたが
DeleteResult objectが返るようになった
まあ、deleteOneの返り値を使う処理はしていないので問題ないのですが
mongoose 8系はMongoDB Node Driver v6.xを使用するが、
MongoDB Node Driver v6.17ではMongoDB 4.0のサポートが削除されている
オンプレ版は既に5.0以上が必要になっているので、4.0のサポートが削除されても問題ナシohnishiakira.icon
12桁のObjectIdのサポートが打ち切られ、new mongoose.Types.ObjectId('12charstring')がthrow errorされるようになった
これまでimportできてたJSONがimportできなくなる可能性はあるが
それはそのJSONがおかしいだけなので問題なし
Claude Codeはこの部分等に直接例外処理を挿入して、エラーを握りつぶそうとしてくる code:src/server/models/project/json-import.ts
if (Array.isArray(files)) {
page.files = uniq(files).map(file => new mongoose.Types.ObjectId(file));
}
不正なデータが入力されたら、ユーザーに「不正なデータです」と報告するべき
処理できる所だけ処理して、ダメだった所を握りつぶして報告しないのは本当にダメ
Removed findOneAndRemove()
使用箇所無し
Removed count()
使用箇所無し
使用箇所無し
doc.id = '0'.repeat(24)
_idを更新していいものだと思ってなかったので、これ可能だったんだと驚いたshokai.icon
使用箇所無し
type: Stringかつenumのfieldに、nullを保存できるようになった mongoose 7まではnullを保存できなかった
required: trueを指定すると、nullを保存できなくなる
まあこれはこの方が正しい挙動なような気もするshokai.icon
save時に値が空Object、つまり{}のfieldは、undefinedとして保存されるようになった
% db.projects.updateOne({ nameLc: 'nota' }, { $unset: {'additionalPlans.kcs': true} })
という方法だと
additionalPlans: {}になる可能性があるので
MongoDBにsaveした時点で.additionalPlans: undefinedになる
対応
常にnull checkする
あるいはmongooseのdefault機能を使って、DB上でundefinedだったらnode.js上では{}をセットする
Cosenseではこっちを採用しているshokai.icon
Apply base schema paths before discriminator paths
使用箇所無し
こんな気持ち悪い多重継承みたいな機能あったんだshokai.icon
Removed overwrite option for findOneAndUpdate()
使用箇所無し
Changed behavior for findOneAndUpdate() with orFail() and upsert
使用箇所無し
使用箇所無し
createには複数の引数を渡すと、複数のdocumentを作成できる
mongoose 7では先頭から順に保存される。失敗した所から後ろは保存されない
mongoose 8では、引数のうち1つが失敗しても、その後のdocumentは保存される
使用箇所無し
Modelのstatic methodのvalidateの挙動が変更された
save時に自動呼び出しされるvalidatorではない
validate対象のobjectを変更してしまう事があったらしい
明示的に使用している箇所は無いはずshokai.icon
mongoose 7では、例えばtype Stringのfieldにはstringとundefinedしか保存できなかった
mongoose 8では、stringとundefinedとnullを保存できる
元々MongoDBってnullもundefinedも保存できるものだし
そういう値が入っている事を前提にアプリケーションコードを書くか
よくわからんshokai.icon
Infer distinct() return types from schema